package gui;

import app.Application;
import app.Groupe;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import javax.swing.*;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.filechooser.FileFilter;

/**
 *
 * @author alexisl
 */
public class Panneau extends JPanel {

    private int LARGEUR;
    private int HAUTEUR;
    private Application application;
    private Panneau panneau;
    private JScrollPane scrGroupes;
    private JScrollPane scrMembres;
    private JList lstGroupes;
    private JList lstMembres;
    private JLabel lblTitre;
    private JLabel lblUtilisateur;
    private JLabel lblMotDePasse;
    private JLabel lblErreur;
    private JTextField txtUtilisateur;
    private JPasswordField pswMotDePasse;
    private JButton btnConnexion;
    private JButton btnMettreAJour;
    private JButton btnImporter;
    private JButton btnAjouterGroupe;
    private JButton btnAjouterMembre;
    private JButton btnSupprimerGroupe;
    private JButton btnSupprimerMembre;
    private JProgressBar prgBarre;
    private JLabel lblProgressGroup;
    private JLabel lblProgressMember;
    private JProgressBar connexionBarre;
    private JLabel lblConnexion;

    public Panneau(Fenetre fen, int largeur, int hauteur, Application app) {
        LARGEUR = largeur;
        HAUTEUR = hauteur;

        application = app;

        initialisation();
        setListeners();
    }

    private void initialisation() {
        setSize(LARGEUR, HAUTEUR);
        setLayout(null);

        //Panneau representant la classe pour les listeners
        panneau = this;

        //Liste des groupes
        lstGroupes = new JList();

        //Liste des membres
        lstMembres = new JList();

        //Panneau de scroll pour la liste de groupes
        scrGroupes = new JScrollPane(lstGroupes);
        scrGroupes.setBounds(10, 10, LARGEUR / 3 - 15, panneau.getHeight() - 50);

        //Panneau de scroll pour la liste des membres
        scrMembres = new JScrollPane(lstMembres);
        scrMembres.setBounds(scrGroupes.getX() + scrGroupes.getWidth() + 10, 10, scrGroupes.getWidth(), scrGroupes.getHeight());

        //Bouton de confirmation et connexion au serveur Google
        btnConnexion = new JButton("Connexion");
        btnConnexion.setSize(100, 40);
        btnConnexion.setLocation(LARGEUR / 2 - btnConnexion.getWidth() / 2, HAUTEUR - HAUTEUR / 4 - btnConnexion.getHeight() / 2);
        add(btnConnexion);

        //Bouton de mise a jour des groupes
        btnMettreAJour = new JButton("Mettre à jour");
        btnMettreAJour.setSize(LARGEUR / 4, 35);
        btnMettreAJour.setLocation(((scrMembres.getX() + scrMembres.getWidth() + 10) + (LARGEUR - 15)) / 2 - btnMettreAJour.getWidth() / 2, 10);

        //Bouton pour importer des groupes a partir d'un fichier texte
        btnImporter = new JButton("Importer");
        btnImporter.setSize(LARGEUR / 4, 35);
        btnImporter.setLocation(((scrMembres.getX() + scrMembres.getWidth() + 10) + (LARGEUR - 15)) / 2 - btnMettreAJour.getWidth() / 2, 55);

        //Bouton pour ajouter un groupe
        btnAjouterGroupe = new JButton("Ajouter groupe");
        btnAjouterGroupe.setSize(LARGEUR / 4, 35);
        btnAjouterGroupe.setLocation(((scrMembres.getX() + scrMembres.getWidth() + 10) + (LARGEUR - 15)) / 2 - btnMettreAJour.getWidth() / 2, 100);

        //Bouton pour ajouter un membre au groupe selectionne
        btnAjouterMembre = new JButton("Ajouter membre");
        btnAjouterMembre.setSize(LARGEUR / 4, 35);
        btnAjouterMembre.setLocation(((scrMembres.getX() + scrMembres.getWidth() + 10) + (LARGEUR - 15)) / 2 - btnMettreAJour.getWidth() / 2, 145);

        //Bouton pour supprimer le groupe selectionne (ainsi que ses membres)
        btnSupprimerGroupe = new JButton("Supprimer groupe");
        btnSupprimerGroupe.setSize(LARGEUR / 4, 35);
        btnSupprimerGroupe.setLocation(((scrMembres.getX() + scrMembres.getWidth() + 10) + (LARGEUR - 15)) / 2 - btnMettreAJour.getWidth() / 2, 190);

        //Bouton pour supprimer le membre selectionne
        btnSupprimerMembre = new JButton("Supprimer membre");
        btnSupprimerMembre.setSize(LARGEUR / 4, 35);
        btnSupprimerMembre.setLocation(((scrMembres.getX() + scrMembres.getWidth() + 10) + (LARGEUR - 15)) / 2 - btnMettreAJour.getWidth() / 2, 235);

        //Etiquette du titre de la page afichee
        lblTitre = new JLabel("Authentification", SwingConstants.CENTER);
        lblTitre.setSize(90, 10);
        lblTitre.setLocation(LARGEUR / 2 - lblTitre.getWidth() / 2, HAUTEUR / 4 - lblTitre.getHeight() / 2);
        add(lblTitre);

        //Etiquette pour le nom d'utilisateur
        lblUtilisateur = new JLabel("Nom d'utilisateur :", SwingConstants.RIGHT);
        lblUtilisateur.setSize(110, 30);
        lblUtilisateur.setLocation(LARGEUR / 2 - lblUtilisateur.getWidth() - 5, HAUTEUR / 2 - lblUtilisateur.getHeight());
        add(lblUtilisateur);

        //Etiquette pour le mot de passe
        lblMotDePasse = new JLabel("Mot de passe :", SwingConstants.RIGHT);
        lblMotDePasse.setSize(100, 30);
        lblMotDePasse.setLocation(LARGEUR / 2 - lblMotDePasse.getWidth() - 5, HAUTEUR / 2);
        add(lblMotDePasse);

        //Etiquette d'affichage d'erreur de connexion
        lblErreur = new JLabel("", SwingConstants.CENTER);
        lblErreur.setSize(300, 30);
        lblErreur.setLocation(LARGEUR / 2 - lblErreur.getWidth() / 2, lblTitre.getY() + lblErreur.getHeight());
        lblErreur.setForeground(Color.RED);

        //Zone de texte pour entrer le nom d'utilisateur
        txtUtilisateur = new JTextField("@gmail.com");
        txtUtilisateur.setSize(150, 30);
        txtUtilisateur.setLocation(LARGEUR / 2 + 5, HAUTEUR / 2 - txtUtilisateur.getHeight());
        add(txtUtilisateur);

        //Zone de texte pour entrer le mot de passe
        pswMotDePasse = new JPasswordField();
        pswMotDePasse.setSize(150, 30);
        pswMotDePasse.setLocation(LARGEUR / 2 + 5, HAUTEUR / 2);
        add(pswMotDePasse);

        //Barre de progression de la creation des groupes
        prgBarre = new JProgressBar();
        prgBarre.setSize(300, 20);
        prgBarre.setLocation(LARGEUR / 2 - prgBarre.getWidth() / 2, HAUTEUR / 2 - prgBarre.getHeight() / 2);
        prgBarre.setMaximum(100);
        prgBarre.setValue(0);

        //Etiquette du groupe en progression
        lblProgressGroup = new JLabel("", SwingConstants.LEFT);
        lblProgressGroup.setSize(prgBarre.getWidth(), 20);
        lblProgressGroup.setLocation(prgBarre.getX(), prgBarre.getY() - 40);

        //Etiquette du membre en progression
        lblProgressMember = new JLabel("", SwingConstants.LEFT);
        lblProgressMember.setSize(prgBarre.getWidth(), 20);
        lblProgressMember.setLocation(prgBarre.getX(), prgBarre.getY() - 20);

        //Barre de connexion
        connexionBarre = new JProgressBar();
        connexionBarre.setSize(300, 20);
        connexionBarre.setLocation(LARGEUR / 2 - connexionBarre.getWidth() / 2, HAUTEUR / 2 - connexionBarre.getHeight() / 2);
        connexionBarre.setIndeterminate(true);

        //Etiquette de connexion
        lblConnexion = new JLabel("Connexion", SwingConstants.CENTER);
        lblConnexion.setSize(200, 20);
        lblConnexion.setLocation(LARGEUR / 2 - lblConnexion.getWidth() / 2, connexionBarre.getY() - lblConnexion.getHeight());
    }

    private void setListeners() {
        btnConnexion.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                new Thread() {

                    @Override
                    public void run() {
                        application.setUsername(txtUtilisateur.getText());
                        application.setPassword(pswMotDePasse.getPassword());
                        pswMotDePasse.setText(null);

                        if (application.setConnexion()) {
                            lblConnexion.setText("Importation des groupes");
                            application.retrieveGroups(true);
                            lstGroupes.setListData(application.getListeGroupes().toArray());

                            panneau.removeAll();
                            panneau.add(btnMettreAJour);
                            panneau.add(btnImporter);
                            panneau.add(btnAjouterGroupe);
                            panneau.add(btnAjouterMembre);
                            panneau.add(btnSupprimerGroupe);
                            panneau.add(btnSupprimerMembre);
                            panneau.add(scrGroupes);
                            panneau.add(scrMembres);
                            panneau.repaint();
                        } else {
                            lblErreur.setText("Nom d'utilisateur ou mot de passe invalide!");
                            if (!lblErreur.isShowing()) {
                                panneau.removeAll();
                                panneau.add(lblTitre);
                                panneau.add(lblUtilisateur);
                                panneau.add(lblMotDePasse);
                                panneau.add(txtUtilisateur);
                                panneau.add(pswMotDePasse);
                                panneau.add(btnConnexion);
                                panneau.add(lblErreur);
                                panneau.repaint();
                            }

                            panneau.repaint();
                        }
                    }
                }.start();

                panneau.removeAll();
                panneau.add(connexionBarre);
                panneau.add(lblConnexion);
                panneau.repaint();
            }
        });

        btnMettreAJour.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                new Thread() {

                    @Override
                    public void run() {
                        int erreur = 0; //0 = tout va bien; 1 ou autre = erreur;

                        //Mise a jour
                        if (erreur == 0) {
                            erreur = application.miseAJour();

                            if (erreur != 0) {
                                JOptionPane.showMessageDialog(null, "Erreur lors de la mise à jour...", "", JOptionPane.ERROR_MESSAGE);

                                //Reset du panneau
                                panneau.removeAll();
                                panneau.add(btnMettreAJour);
                                panneau.add(btnImporter);
                                panneau.add(btnAjouterGroupe);
                                panneau.add(btnAjouterMembre);
                                panneau.add(btnSupprimerGroupe);
                                panneau.add(btnSupprimerMembre);
                                panneau.add(scrGroupes);
                                panneau.add(scrMembres);
                                panneau.repaint();
                            }
                        }

                        //Reset du panneau
                        if (erreur == 0) {
                            panneau.removeAll();
                            panneau.add(btnMettreAJour);
                            panneau.add(btnImporter);
                            panneau.add(btnAjouterGroupe);
                            panneau.add(btnAjouterMembre);
                            panneau.add(btnSupprimerGroupe);
                            panneau.add(btnSupprimerMembre);
                            panneau.add(scrGroupes);
                            panneau.add(scrMembres);
                            panneau.repaint();
                        }
                    }
                }.start();

                //Setup du mode barre de progression
                panneau.removeAll();
                panneau.add(prgBarre);
                panneau.add(lblProgressGroup);
                panneau.add(lblProgressMember);
                panneau.revalidate();
                panneau.repaint();
            }
        });

        btnImporter.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                JFileChooser chooser = new JFileChooser();
                chooser.setCurrentDirectory(new java.io.File("."));
                chooser.setDialogTitle("Fichier à importer...");
                chooser.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
                chooser.setFileFilter(new FileFilter() {

                    @Override
                    public boolean accept(File file) {
                        String filename = file.getName();
                        return filename.endsWith(".txt");
                    }

                    @Override
                    public String getDescription() {
                        return "*.txt";
                    }
                });

                if (chooser.showOpenDialog(panneau) == JFileChooser.APPROVE_OPTION) {
                    application.setFichierPath(chooser.getSelectedFile());

                    if (application.lectureFichier() != 0) {
                        JOptionPane.showMessageDialog(null, "Erreur lors de la lecture du fichier groups.txt!\nVeuillez verifierla validite du fichier!", "", JOptionPane.ERROR_MESSAGE);
                    } else {
                        lstGroupes.setListData(application.getListeGroupes().toArray());
                        panneau.repaint();
                    }
                } else {
                    System.out.println("No Selection ");
                }
            }
        });

        btnAjouterGroupe.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                boolean nomValide = false;
                String result;

                while (!nomValide) {
                    result = JOptionPane.showInputDialog(panneau, "Nom du groupe :", "Ajouter groupe", JOptionPane.PLAIN_MESSAGE);

                    if (result == null) {
                        nomValide = true;
                    } else {
                        result.trim();
                        result.replaceAll(" ", "_");

                        if (!result.equals("")) {
                            nomValide = true;

                            application.addGroupe(result);
                            application.sortGroupes();
                            lstGroupes.setListData(application.getListeGroupes().toArray());
                            panneau.repaint();
                        } else {
                            JOptionPane.showMessageDialog(null, "Nom vide", "", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                }
            }
        });

        btnAjouterMembre.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                boolean nomValide = false;
                String result;

                while (!nomValide) {
                    result = JOptionPane.showInputDialog(panneau, "Courriel du membre :", "Ajouter membre", JOptionPane.PLAIN_MESSAGE);

                    if (result == null) {
                        nomValide = true;
                    } else {
                        result.trim();
                        result.replaceAll(" ", "_");

                        if (!result.equals("")) {
                            nomValide = true;

                            for (int i = 0; i < lstGroupes.getSelectedValues().length; i++) {
                                ((Groupe) (lstGroupes.getSelectedValues()[i])).addMembre(result);
                            }

                            application.sortGroupes();
                            lstMembres.setListData(((Groupe) (lstGroupes.getSelectedValues()[0])).getEmailsGroupe().toArray());
                            panneau.repaint();
                        } else {
                            JOptionPane.showMessageDialog(null, "Nom vide", "", JOptionPane.ERROR_MESSAGE);
                        }
                    }
                }
            }
        });

        btnSupprimerGroupe.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                for (int i = 0; i < lstGroupes.getSelectedValues().length; i++) {
                    for (int j = 0; j < application.getListeGroupes().size(); j++) {
                        if (application.getListeGroupes().get(j).getNomGroupe().equals(((Groupe) (lstGroupes.getSelectedValues()[i])).getNomGroupe())) {
                            application.getListeGroupes().remove(j);
                        }
                    }
                }

                lstMembres.setListData(new Object[0]);
                lstGroupes.setListData(application.getListeGroupes().toArray());
                panneau.repaint();
            }
        });

        btnSupprimerMembre.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent ae) {
                for (int k = 0; k < lstMembres.getSelectedValues().length; k++) {
                    for (int i = 0; i < lstGroupes.getSelectedValues().length; i++) {
                        for (int j = 0; j < application.getListeGroupes().size(); j++) {
                            for (int l = 0; l < application.getListeGroupes().get(j).getEmailsGroupe().size(); l++) {
                                if (application.getListeGroupes().get(j).getNomGroupe().equals(((Groupe) (lstGroupes.getSelectedValues()[i])).getNomGroupe())) {
                                    if (application.getListeGroupes().get(j).getEmailsGroupe().get(l).equals(((String) (lstMembres.getSelectedValues()[k])))) {
                                        application.getListeGroupes().get(j).getEmailsGroupe().remove(l);
                                    }
                                }
                            }
                        }
                    }
                }

                lstMembres.setListData(((Groupe) (lstGroupes.getSelectedValues()[0])).getEmailsGroupe().toArray());
                panneau.repaint();
            }
        });

        lstGroupes.addListSelectionListener(new ListSelectionListener() {

            @Override
            public void valueChanged(ListSelectionEvent lse) {
                try {
                    lstMembres.setListData(((Groupe) (lstGroupes.getSelectedValues()[0])).getEmailsGroupe().toArray());
                } catch (Exception e) {
                }
            }
        });
    }

    public void updateBar(int progressValue, int progressMax, String action, String item) {
        prgBarre.setValue(progressValue);
        prgBarre.setMaximum(progressMax);
        lblProgressGroup.setText(action);
        lblProgressMember.setText(item);
    }
}
